package com.pan.alg.niuke.tree;

import java.util.ArrayList;
import java.util.List;

/**
 * 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
 * 1.对于该题的最近的公共祖先定义:对于有根树T的两个节点p、q，最近公共祖先LCA(T,p,q)表示一个节点x，满足x是p和q的祖先且x的深度尽可能大。在这里，一个节点也可以是它自己的祖先.
 * 2.二叉搜索树是若它的左子树不空，则左子树上所有节点的值均小于它的根节点的值； 若它的右子树不空，则右子树上所有节点的值均大于它的根节点的值
 * 3.所有节点的值都是唯一的。
 * 4.p、q 为不同节点且均存在于给定的二叉搜索树中。
 * 数据范围:
 * 3<=节点总数<=10000
 * 0<=节点值<=10000
 *
 * 如果给定以下搜索二叉树: {7,1,12,0,4,11,14,#,#,3,5}，如下图:
 */
public class TreeLowestCommonAncestor {

    public int lowestCommonAncestor (TreeNode root, int p, int q) {
        // write code here
        List<Integer> pathp = getPath(root,p);
        List<Integer> pathq = getPath(root,q);
        int result =0;
        for (int i = 0; i < pathp.size()&& i < pathq.size(); i++) {
            int valp = pathp.get(i);
            int valq = pathq.get(i);
            //注意包装类用==会出错。
            if(valp==valq){
                result= valp;
            }else {
                break;
            }
        }
        return result;
    }

    private List<Integer> getPath(TreeNode root, int p) {
        List<Integer> path =new ArrayList<>();
        TreeNode current =root;
        while(current.val!=p){
            Integer val = current.val;
            path.add(val);
            if(val>p){
                current=root.left;
            }else if(val<p){
                current=root.right;
            }
        }
        return path;
    }
}
